import java.util.Random;
import java.util.Scanner;

public class test {
    public static void main(String[] args) {
        //数组的3种初始化方法
        int [] array={1,2,3,4,5};//是array2的精简化初始化
        int [] array2=new int[]{1,2,3,4,5};
        int[] array3=new int[5];//默认值为0

        //初始化
        int[]array4;
        array4=new int[]{1,2,3,4,5};//{1,2,3,4,5}是一个对象，用new产生
        System.out.println(array);//array是引用类型，用于存储地址，
        //[I@4eec7777输出的地址是被哈希处理过的，[代表是数组，I代表是int类型，@理解为分隔符，后面的理解为被处理过的地址
        int[]array5=null;//代表array这个引用不指向任何对象
    }

    //汉诺塔问题
    public static void move(char A,char C){
        System.out.print(A+"->"+C+" ");
    }
    /**
     *
     * @param n 盘子的个数
     * @param A 起始位置
     * @param B 中转位置
     * @param C 目标位置
     */
    public static void hanita(int n,char A,char B ,char C){
        if(n==1){
            move(A,C);
        }
        else{
            hanita(n-1,A,C,B);
            move(A,C);
            hanita(n-1,B,A,C);
        }
    }
    public static void main77(String[] args) {
        hanita(1,'A','B','C');
        System.out.println();
        hanita(2,'A','B','C');
        System.out.println();
        hanita(3,'A','B','C');
        System.out.println();
        hanita(4,'A','B','C');
    }

    //编写代码模拟三次密码输入的场景。 最多能输入三次密码，密码正确，提示“登录成功”,密码错误， 可以重新输 入，最多输入三次。三次均错，则提示退出程序
    public static void login(){
        int count=3;
        Scanner scan=new Scanner(System.in);
        String string="123456";
        while(count!=0){
            System.out.println("请输入密码：");
            String password= scan.nextLine();
            if(password.equals(string)){//匹配字符串使用equals
                //登录成功
                System.out.println("登录成功！");
                break;
            }
            else{
                //登录失败
                count--;
                System.out.println("密码错误，你还有"+count+"次机会！");
            }
        }
    }
    //逆序输出一个整数的每一位，如：123的每一位是3，2，1
    public static void func1(int n){
        while(n!=0){
            System.out.println(n%10);
            n/=10;
        }
    }
    //顺序打印一个整数的每一位，如：123的每一位是，1，2，3
    public static void func2(int n){
        if(n<10){
            System.out.print(n+" ");
        }
        else{
            func2(n/10);
            System.out.print(n%10+" ");
        }
    }
    //递归求1+2+3……+10
    public static int func3(int n){
        if(n==1){
            return n;
        }
        else{
            return n+func3(n-1); //3  3+2+1
        }
    }
    //写一个递归方法，输入一个非负整数，返回组成它的数字之和. 例如，输入 1729, 则应该返回
    //1+7+2+9，它的和是19
    public static int func4(int n){
        if(n<10){
            return n;
        }
        else{
            return n%10+func4(n/10);
        }
    }
//    求斐波那契数列的第 N 项  1 1 2 3 5 8
    //循环的解法
    public static int fib(int n){
        int a=1;
        int b=1;
        int c=1;
        n=n-2;
        while(n!=0){
            c=a+b;
            a=b;
            b=c;
            n--;
        }
        return c;
    }
    //
    public static int fib3(int n){
        int f1=1;
        int f2=1;
        int f3=0;
        for (int i =3 ; i <=n ; i++) {
            f3=f1+f2;
            f2=f3;
            f1=f2;
        }
        return f3;
    }
    //递归的解法
    public static int count=0;
    public static int fib2(int n){
        if(n==1||n==2){
            count++;//用于记录该过程执行了多少次
            return 1;
        }
        return fib2(n-1)+fib2(n-2);
    }
    public static void main55(String[] args) {
        //func1(15723);
        //func2(15723);
        int ret=fib2(40);
        System.out.println(ret);
        System.out.println(count);
    }
    //计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值
    public static void main44(String[] args) {
        double ret=0;//注意这里要用double,不能用int
        int flag=1;
        for (int i = 1; i <=100;i++) {
            ret += 1.0 / (flag * i);
            flag=-flag;//用于改变i的符号
        }
        System.out.println(ret);
    }
    //打印x形图案
    public static void printX(int n){
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if(i==j||i+j==n-1){
                    System.out.print("*");
                }
                else{
                    System.out.print(" ");
                }
            }
            System.out.println();//换行
        }
    }
    public static void main333(String[] args) {
        printX(5);
    }
    public static void main33(String[] args) {
        //java实现猜数字游戏
        int count=5;
        Scanner scan=new Scanner(System.in);
        Random random=new Random();
        int randNum=random.nextInt(100);//[0,100)
        //System.out.println("随机数是："+randNum);用于测试时使用
        while(true){
            System.out.println("你还有"+count+"次机会！");
            System.out.println("请输入要猜的数字：");
            int num=scan.nextInt();
            if(num>randNum){
                System.out.println("猜大了！");
            }
            else if(num<randNum){
                System.out.println("猜小了！");
            }
            else{
                System.out.println("恭喜你，猜对了！数字是："+randNum);
                break;
            }
            count--;
            if(count==0){
                System.out.println("很遗憾，挑战失败！数字是："+randNum);
                break;
            }
        }
    }
    //1~100数字9出现的个数
    public static int fan1(int n){
        int count=0;
        for (int i = 1; i <=100 ; i++) {
            if(i%10==9){//取个位上的9  有9 19 29……99 有10个
                count++;
            }
            if(i/10==9){//取十位上的9  有90 91 92 93……99 有10个
                count++;
            }
        }
        return count ;
    }

    public static void main12(String[] args) {
        System.out.println(fan1(100));
    }
    //写一个函数求阶乘
    public static int fac(int n) {
        int ret = 1;
        for (int i = 1; i <= n; i++) {
            ret *= i;
        }
        return ret;
    }
        //此函数求阶乘的和
    public static int facSum(int n){
            int sum=0;
            for (int i = 1; i <=n ; i++) {
                sum+=fac(i);
            }
            return sum;//要记得要写返回值，漏了就会一直报错
        }

    public static void main3(String[] args) {
        int n=facSum(5);
        System.out.println(n);
    }
    public static int add (int x,int y){
        int ret=x+y;
        return ret;
        //方法本身有返回值，但没有return 就会编译报错
    }
    //定义一个方法：判断是否是闰年
    public static boolean isLeapYear (int year){
        if((0==year%4&&0!=year%100)||0==year%400){
            return true;
        }
        else{
            return false;
        }
    }

    public static void main2(String[] args) {
        int year=2000;

        boolean ret=isLeapYear(year);
        if(ret==true){
            System.out.println(year+"是闰年！");
        }
        else{
            System.out.println(year+"不是闰年！");
        }
    }
    public static void main1(String[] args) {
        int a=10;
        int b=20;
        int ret=add(a,b);//比配操作：参数类型和个数、返回追
        System.out.println(ret);
    }
}
